package com.tedu.API.thread;

/**
 *线程---创建  3种
 *   第一种:  子类  继承Thread 方案--【使用率不多】
 *       第一步: 编写一个子类My Thread1  继承 Thread
 *       第二步: 子类中重写run方法 【线程的运行】
 *       第三步: 实例化 MyThread1 对象   调用 start方法 【启动线程】
 *
 *   第二种:  子类  实现Runnable接口  方案--【推荐用法】
 *      第一步: 编写子类 MyRunnable1  实现 Runnable  接口
 *      第二步: 子类，强制重写run方法  【线程运行】
 *      第三步: 实例化MyRunnable1 【没有start方法】
 *      第四步: 创建Thread对象，把实例化MyRunnable1 对象通过构造器
 *      第五步: 调用Thread对象  start方法
 *
 *   线程  继承Thread 内嵌入Runnable接口  重写run方法
 *        JavaOOP----缺点: Java只支持单继承, 子类继承Thread,
 *        无法拓展: 不仅线程、其他集合、继承其他类, 只具备线程功能
 *        启动线程方法: start() ---线程生命周期
 *        缺点: 线程创建不明确
 *        实现Runnable  真正线程的运行---定义run方法，规定线程运行状态
 *        优点: 继承还可以实现---拓展性高
 *        缺点: 线程创建不方便---项目:步骤逻辑清晰，可阅读性较高
 *   第三种:  匿名内部类实现线程--->Lambda表达式
 */
public class RunnableAPI {
    public static void main(String[] args) {
        //③.创建 实现线程 对象 ---启动线程必须用start()
        MyRunnable1 mr1=new MyRunnable1();
        //④.创建 Thread对象----启动线程方法
        Thread t1=new Thread(mr1);
        //⑤.调用Thread对象  start方法
        t1.start();

        //练习: MyRunnable2 子类  实现 Runnable---1000次
        //                       这是上天送给我的小礼物吗?
        MyRunnable2 mr2=new MyRunnable2();
        Thread t2=new Thread(mr2);
        t2.start();
    }
}
//①.创建子类 MyRunnable1 | 线程实现类
class MyRunnable1 implements Runnable{
    //②.子类，强制重写run方法  【线程运行】
    public void run() {
       for (int i=0;i<1000;i++){
           System.out.println("你是上天送给我的小礼物~~~");
       }
    }
}
class MyRunnable2 implements Runnable{
    public void run() {
        for (int i=0;i<1000;i++){
        System.out.println("这是上天送给我的小礼物吗?");
        }
    }
}